iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
自我挑戰組

leetcode解題學習java系列 第 7

30天LeetCode挑戰紀錄-DAY7. Merge Intervals

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20250921/20178158U0tPaoJBg7.png

它說會給一個陣列intervals,然後intervals[i] = [starti, endi],我們要把有重疊到的區間合併成一個區間。
像範例1:
input: intervals = [[1,3],[2,6],[8,10],[15,18]]
output: [[1,6],[8,10],[15,18]]
因為區間 [1,3] 和 [2,6] 重疊,所以就把它們合併成 [1,6]。

想法

我想要先把每個區間的開頭由小到大排好,然後把前面區間的尾數跟後面區間的開頭比較,如果前面的尾數小於後面的開頭就合併,然後更新陣列,繼續比較。

所以我先用Arrays.sort(intervals, (a, b) -> a[0] - b[0]);把他們的開頭由小到大排好,然後再用if,else進行比較。

程式碼

class Solution {
    public int[][] merge(int[][] intervals) {

        Arrays.sort(intervals, (a, b) -> a[0] - b[0]); //排序

        List<int[]> result = new ArrayList<>();
        result.add(intervals[0]);  //先放第一個區間,這樣後面才能跟他比較

        for (int i = 1; i < intervals.length; i++) {
            int[] last = result.get(result.size() - 1);
            int[] current = intervals[i];

            // 判斷是否合併
            if (last[1] >= current[0]) {
                last[1] = Math.max(last[1], current[1]); // 更新尾數
            } else {
                result.add(current); 
            }
        }
        return result.toArray(new int[result.size()][]);
    }
}

程式碼執行成功畫面
https://ithelp.ithome.com.tw/upload/images/20250921/20178158brZU3IMJJ5.png


上一篇
30天LeetCode挑戰紀錄-DAY6. Maximum Subarray
下一篇
30天LeetCode挑戰紀錄-DAY8. 制定第二週目標、Valid Anagram
系列文
leetcode解題學習java16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言